﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Bettzueche.RLLibrary.Functions
{
    public static class HilfsFunktionen
    {
        public static double Square(double x)
        {
            //double f = Math.Pow(x, 2);
            return x * x;
        }
        public static float Square(float x)
        {
            return x * x;
        }


        #region Weltfunktionen

        /// <summary>
        /// Gibt (berechnet) zur gegebenen, kontinuierlichen Ebenenkoordinate das Maß der Unebenheit.
        /// </summary>
        /// <param name="x">X-Koordinate. Wert aus [-64, 64]empfohlen</param>
        /// <param name="y">Y-Koordinate. Wert aus [-64, 64]empfohlen</param>
        /// <returns></returns>
        /// <seealso cref="AMEEWoldDraft.BumbinessFunction(Double,Double)"/>
        public static double Weltfunktion(double x, double y)
        {
            return 1.0 - HilfsFunktionen.Square(Math.Cos(Math.PI * x / 128.0)) * Square(Math.Cos(Math.PI * y / 128.0));
        }

        /// <summary>
        /// Gibt (berechnet) zur gegebenen, kontinuierlichen Ebenenkoordinate das Maß der Unebenheit.
        /// </summary>
        /// <param name="x">X-Koordinate. Wert aus [-64, 64]empfohlen</param>
        /// <param name="y">Y-Koordinate. Wert aus [-64, 64]empfohlen</param>
        /// <returns></returns>
        /// <seealso cref="AMEEWoldDraft.BumbinessFunction(Double,Double)"/>
        public static double Weltfunktion2(double x, double y)
        {
            return Weltfunktion(x, y) + 0.2 - 0.2 * Square(Math.Sin(Math.PI * x / 16.0)) * Square(Math.Sin(Math.PI * y / 16.0));
        }
        /// <summary>
        /// Gibt (berechnet) zur gegebenen, kontinuierlichen Ebenenkoordinate das Maß der Unebenheit.
        /// </summary>
        /// <param name="x">X-Koordinate. Wert aus [-64, 64]empfohlen</param>
        /// <param name="y">Y-Koordinate. Wert aus [-64, 64]empfohlen</param>
        /// <returns></returns>
        /// <seealso cref="AMEEWoldDraft.BumbinessFunction(Double,Double)"/>
        public static double Weltfunktion3(double x, double y)
        {
            return Weltfunktion2(x, y) - 1 / 8 * HilfsFunktionen.Square(Math.Sin(Math.PI * x / 8.0)) * Square(Math.Sin(Math.PI * y / 4.0));
        }

        /// <summary>
        /// Gibt (berechnet) zur gegebenen, kontinuierlichen Ebenenkoordinate das Maß der Unebenheit.
        /// </summary>
        /// <param name="x">X-Koordinate. Wert aus [-64, 64]empfohlen</param>
        /// <param name="y">Y-Koordinate. Wert aus [-64, 175] empfohlen</param>
        /// <returns></returns>
        /// <seealso cref="AMEEWoldDraft.BumbinessFunction(Double,Double)"/>
        public static double Weltfunktion4(double x, double y)
        {
            return Weltfunktion2(x, y) - Math.Exp(-((Square(x - 20) / (2 * Square(20))) + (Square(y - 40) / (2 * Square(66)))));
        }

        #endregion


    }
}
